/* eslint-disable no-param-reassign */
import qs from "qs";
import { useUserStore } from "@/store";
import { isH5, platform } from "@/utils/platform";
import { getAccessToken, getTenantId } from "@/utils/auth";

export type CustomRequestOptions = UniApp.RequestOptions & {
	query?: Record<string, any>;
	/** 出错时是否隐藏错误提示 */
	hideErrorToast?: boolean;
} & IUniUploadFileOptions; // 添加uni.uploadFile参数类型

// 请求基准地址
const baseUrl = import.meta.env.VITE_SERVER_BASEURL;

// 拦截器配置
const httpInterceptor = {
	// 拦截前触发
	invoke(options: CustomRequestOptions) {
		// 接口请求支持通过 query 参数配置 queryString
		if (options.query) {
			const queryStr = qs.stringify(options.query);
			if (options.url.includes("?")) {
				options.url += `&${queryStr}`;
			} else {
				options.url += `?${queryStr}`;
			}
		}
		// 非 http 开头需拼接地址
		if (!options.url.startsWith("http")) {
			if (isH5) {
				if (JSON.parse(__VITE_APP_PROXY__)) {
					// 啥都不需要做
				} else {
					options.url = baseUrl + options.url;
				}
			} else {
				options.url = baseUrl + options.url;
				console.log("url:", options.url);
			}

			// TIPS: 如果需要对接多个后端服务，也可以在这里处理，拼接成所需要的地址
		}
		// 1. 请求超时
		options.timeout = 10000;
		// 2. （可选）添加小程序端请求头标识
		options.header = {
			platform,
			...options.header,
		};
		// 3. 添加 token 请求头标识
		const userStore = useUserStore();
		const token = getAccessToken();
		if (token) {
			options.header.Authorization = `Bearer ${token}`;
		}
		// 4. 添加租户请求头标识
		const tenantId = getTenantId();
		options.header["tenant-id"] = tenantId;
	},
};

export const requestInterceptor = {
	install() {
		// 拦截 request 请求
		uni.addInterceptor("request", httpInterceptor);
		// 拦截 uploadFile 文件上传
		uni.addInterceptor("uploadFile", httpInterceptor);
	},
};
